import pandas as pd
from sqlalchemy import create_engine
import matplotlib.pyplot as plt

host = "cd-cdb-5st0yfog.sql.tencentcdb.com"
port= 63980
user = "root"
password = "cdbeyond-mysql-Aa123456"
database = "iot_product"

# 创建数据库连接 engine
engine = create_engine(f"mysql+pymysql://{user}:{password}@{host}:{port}/{database}")

# SQL查询语句
sql = """
select count(tpd.id) num, tpm.name 
from tt_product_device tpd inner join tt_product_model tpm  on tpd.product_id = tpm.id 
where tpm.connected ='1'  and year(tpd.crt_time) <= 2024 
and year(tpd.crt_time) = 2024
group by tpm.name
order by num  desc limit 10
"""

# 使用pandas的 read_sql_query函数执行SQL语句，并获取返回结果
df = pd.read_sql_query(sql, engine)

# 对dataframe进行预处理
df.sort_values('num', inplace=True)  # 把数据按照数量排序，这样在图中的柱形会按照大小顺序显示
df.reset_index(drop=True, inplace=True)  # 重设索引，让饼图按照排序后的顺序显示

# Matplotlib 绘制饼图
plt.figure(figsize=(10,6))
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像时的负号问题
plt.pie(df['num'], labels=df['name'], autopct=lambda x: '{:.0f}'.format(x * sum(df['num'])/100))  # 使用pie函数绘制饼图，并设置标签和值的格式
plt.title(f'24年平台接入物联网设备前10 (总数: 3374)')  # 在标题中添加总数

# 如果你想在饼图中心显示总数
#plt.text(0, 0, total, ha='center')

plt.show()
